package com.hzw.saas.api.storage;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import com.hzw.saas.api.storage.bo.*;

/**
 * Rsync同步服务接口
 *
 * @author EZ09
 * @since 07/07/2021
 */
public interface IRsyncService {

    /**
     * 获取文件版本对比信息，包含fileId对应的文件信息和fileId相关联最新版的文件信息
     *
     * @param fileId 文件ID
     * @return 文件信息 400-请求参数异常，503-文件正在合并
     */
    SyncVersionFileBO getVersionInfo(String fileId);

    /**
     * 获取服务端文件同步块
     *
     * @param fileId       文件ID
     * @param blockLength
     * @param blockStep
     * @param checksumMode
     * @return 文件同步块信息 400-请求参数异常， 404-文件丢失，410-文件已过期， 503-文件正在合并
     */
    ServerOriginFileBO listServerOriginBlocks(String fileId, Integer blockLength, Integer blockStep, Integer checksumMode);

    /**
     * 获取服务端文件同步块
     *
     * @param syncId       同步ID
     * @param blockPosList 对比块位置列表
     * @param checksumMode 校验和模式， 1-获取弱校验和，2-获取强校验和，3-同时获取强弱校验和
     * @return 文件同步块信息 400-请求参数异常， 404-文件丢失，410-文件已过期， 503-文件正在合并
     */
    List<OriginBlockBO> listServerOriginBlocks2(String syncId, List<Long> blockPosList, Integer checksumMode);

    /**
     * 接收客户端差异块，并进行文件合并
     *
     * @param clientDiffBlocks 差异块信息
     * @return 合并后的新文件ID 400-请求参数异常， 404-文件丢失，410-文件已过期， 503-文件正在合并
     */
    ResourceFileBO receiveClientDiffBlocks(ClientDiffFileBO clientDiffBlocks);

    /**
     * 接收客户端同步块信息，并计算差异块返回
     *
     * @param clientOriginBlocks 客户端同步块信息
     * @return 差异块  400-请求参数异常， 404-文件丢失， 503-文件正在合并
     */
    ServerDiffFileBO listServerDiffBlocks(ClientOriginFileBO clientOriginBlocks);

    /**
     * 保存差异文件块
     *
     * @param syncId  同步ID
     * @param blockId 差异块ID
     * @param ins     文件流
     */
    void saveClientDiffBlockData(String syncId, String blockId, InputStream ins);

    /**
     * 下载差异文件块
     *
     * @param fileId      文件ID
     * @param blockPos    文件块偏移量
     * @param blockLength 文件块长度
     */
    void getServerDiffBlockData(String fileId, Integer blockPos, Integer blockLength, OutputStream ous);

}
